\section{Ejericio 1}
\subsection{Librería RWLock sin inanición}
Para implementar una librer\'ia \textbf{Read Write Lock libre de inanici\'on}, utilizamos semáforos POSIX mediante la librería de C \textit{semaphore.h}. La librería creada por nosotros consta de los mismos metódos que la clase RWLock brindada por la cátedra. Disponemos de \textbf{4} atributos privados: \textbf{readersQuantity} (contador de lectores, inicializado en 0), \textbf{mutexReaders} (para implementar la sección crítica a la hora de tocar el atributo readersQuantity), \textbf{writers} (Semáforo para saber si hay un escritor esperando, inicializado en 1) y \textbf{freeResource} (para saber si el recurso esta disponible, inicializado en 1).

\subsection{Pseudoc\'odigo}

A continuación el pseudocódigo de la nueva librería RWSemaphoreLock:\\
\mbox{}\\
\textbf WLOCK

Descripción:\\
En el wlock, primero hay que esperar que no haya escritores o lector y luego  que el recurso no esté tomado por otros para poder obtenerlo.
\begin{codebox}

\li	writers.wait() 		\RComment Espero que no haya ningún escritor
\li	freeResource.wait() 	\RComment Espero que se libere el recurso y lo tomo 
\end{codebox}
\mbox{}\\\mbox{}\\
\textbf WUNLOCK
			
Descripción:\\
Primero se libera el recurso, indicando que el escritor se fue y puedan entrar los siguientes lectores o escritores.
Segundo se libera la exclusividad del escritor, realizando un signal de \textit{writers}. 
\begin{codebox}
\li	freeResource.signal()		\RComment Libero el recurso	
\li	writers.signal()		\RComment Libero la exclusividad de los escritores
\end{codebox}
\mbox{}\\\mbox{}\\
\textbf RLOCK

Descripción:\\
El algoritmo primero realiza un wait y signal del semáforo \textit{writers} para evitar la inanición de los lectores, ya que en caso de que haya un escritor antes el lector se quedará esperando.
Luego, aumenta el número de lectores, y en caso de ser el primero toma el recurso, en otro caso no necesitara tomarlo ya que algún lector lo tomó antes. 
\begin{codebox}
\li	writers.wait()			\RComment Espero que no haya escritores, para no $"$colarme$"$ y evitar la inanición.
\li	writers.post()			\RComment Libero el semáforo para que los que vengan puedan seguir.
\li	mutexReaders.wait()		\RComment Tomo el mutex
\li	readersQuantitiy++		\RComment Incremento la cantidad de lectores
\li	\textbf{Si} readersQuantity == 1 \Do	\RComment Si soy el primero... 
\li		freeResource.wait()\End	\RComment .. tomo el recurso para los lectores
\li	mutexReaders.signal()		\RComment Libero el mutex
\end{codebox}
\mbox{}\\\mbox{}\\
\textbf RUNLOCK

Descripción:\\
Para desbloquear a los lectores, primero se decrementa la cantidad de lectores y luego, en caso de ser el último, se libera el recurso. Todo dentro del mutex para asegurar exclusión mutua de la variable.
\begin{codebox}

\li	mutexReaders.wait() \RComment Espero el mutex para asegurarme el uso exclusivo sobre lectores

\li	readersQuantitiy- - \RComment Disminuyo la cantidad de lectores

\li	\textbf{Si} readersQuantitiy == 0 \Do \RComment Si soy el ultimo lector que quedaba ... 
\li	freeResource.signal()\End  \RComment ... libero el recurso así puede tomarlo un escritor o lector (en el caso que hubiese uno esperando)

\li	mutexReaders.signal() \RComment Libero el mutex
\end{codebox}
